import { BaseContext } from 'koa';

export default (service: any): object => ({
    /**
     * 注册用户
     * @param ctx 请求上下文
     * @param next 钩子函数
     */
    async addUser(ctx: BaseContext, next: any) {
        const _params = ctx.request.body;
        console.log(_params);
        if (!_params.user_name) {
            ctx.body = { code: 1, message: '用户名不能为空' };
            return;
        }
        if (!_params.password) {
            ctx.body = { code: 1, message: '密码不能为空' };
            return;
        }
        const params = {
            ..._params,
            login_ip: ctx.ip
        };
        const _user = await service.user.findOne({ user_name: params.user_name }).catch((err: any) => {
            ctx.body = { code: 1, message: err.message };
            return;
        });
        if (_user) {
            ctx.body = { code: 1, message: '用户名已被注册' };
            return;
        }
        await service.user.addUser(params).then(() => {
            ctx.rest();
        }).catch((err: any) => {
            ctx.body = { code: 1, message: err.message };
        });
    },
    /**
     * 查询用户信息
     * @param ctx 请求上下文
     * @param next next函数
     */
    async findById(ctx: BaseContext, next: any) {
        const param = ctx.request.body;
        if (ctx.user === 'no') {
            ctx.body = { code: 1, message: '未登录用户无此权限' };
            return;
        }
        if (ctx.user === 'expired') {
            ctx.body = { code: 1, message: '用户信息已过期，请重新登录' };
            return;
        }
        // 获取当前登录用户信息
        if (!param.id) {
            ctx.rest(ctx.user);
            return;
        }
        const user = await service.user.findById(param.id).catch((err: any) => {
            ctx.body = { code: 1, message: err.message };
            return;
        });
        if (!user && !user._id) {
            ctx.body = { code: 1, message: '用户不存在' };
            return;
        }
        try {
            const role = await service.role.findById(user.role_id);
            user.role = role;
        } catch (error) {
            user.role = null;
        }
        ctx.rest({
            id: user._id,
            user_name: user.user_name,
            status: user.status,
            message_stacks: user.message_stacks,
            credit_rating: user.credit_rating,
            create_at: user.create_at,
            update_at: user.update_at,
            login_ip: user.login_ip,
            role: user.role
        });
    },
    /**
     * 分页查询用户信息
     * @param ctx 请求上下文
     * @param next next函数
     */
    async find(ctx: BaseContext, next: any) {
        // 判断权限
        // if (ctx.user === 'no') {
        //     ctx.body = { code: 1, message: '未登录用户无此权限' };
        //     return;
        // }
        // if (ctx.user === 'expired') {
        //     ctx.body = { code: 1, message: '用户信息已过期，请重新登录' };
        //     return;
        // }
        // 参数
        const param = ctx.request.body;
        param.page_size = Number(param.page_size) || 10;
        param.page_no = param.page_no > 0 ? Number(param.page_no) : 1;
        try {
            const user = await service.user.find(param);
            ctx.rest(user);
        } catch (err) {
            ctx.body = { code: 1, message: err.message };
        }
    },
    /**
     * 管理员修改用户权限
     * @param ctx 请求上下文
     * @param next 钩子函数
     */
    async updateUserRoleId(ctx: BaseContext, next: any) {
        // 权限验证
        if (ctx.user === 'no') {
            ctx.body = { code: 1, message: '未登录用户无此权限' };
            return;
        }
        if (ctx.user === 'expired') {
            ctx.body = { code: 1, message: '用户信息已过期，请重新登录' };
            return;
        }
        // 参数验证
        const param = ctx.request.body;
        if (!param.role_id) {
            ctx.body = { code: 1, message: 'role_id不能为空' };
            return;
        }
        if (!param.user_id) {
            ctx.body = { code: 1, message: 'user_id不能为空' };
            return;
        }
        const user = await service.user.updateUserRoleId(param).catch((err: any) => {
            ctx.body = { code: 1, message: err.message };
            return;
        });
        if (!user) {
            ctx.body = { code: 1, message: '修改失败' };
            return;
        }
        ctx.rest();
    }
});